export function generate(el) {
    let children = getChildren(el)
    // 抽象语法树转换成字符串,_c(div,{id:"app",style:{"background":"green","color":"red","font-size":"20px"}})
    let code = `_c('${el.tag}',${el.attrs.length ?
        `${genProps(el.attrs)}` : undefined},${children ? `${children}` : undefined})`
    // return code
    return code
}
// 处理标签的标签体/子标签 children
function getChildren(el) {
    let children = el.children
    if (children) {
        return children.map(child => gen(child)).join(",")
    }
}
// 匹配 {{ }} 表达式
const defaultTagRE = /\{\{((?:.|\r?\n)+?)\}\}/g;
function gen(element) {
    // 如果是标签
    // 1:标签
    // 3:文本
    if (element.type === 1) {
        return generate(element)
    } else {
        // 文本数据：1、没有插值表达式，是普通文本 2、是插值表达式
        // 获取到文本数据
        let text = element.text
        // 没有插值表达式
        if (!defaultTagRE.test(text)) {
            return `_v(${JSON.stringify(text)})`
        }
        debugger
        // 有插值表达式
        let tokens = []

        // 有可能有多个插值表达式，解决正则多次匹配失效问题，lastIndex是正则中的一个记录器，需要重置
        let lastIndex = defaultTagRE.lastIndex = 0
        let match
        while (match = defaultTagRE.exec(text)) {
            let index = match.index
            if (index > lastIndex) {
                // 添加内容
                tokens.push(JSON.stringify(text.slice(lastIndex, index)))
            }
            tokens.push(`_s(${match[1].trim()})`)
            lastIndex = index + match[0].length
        }
        // 判断插值表达式后面是否还有内容
        if (lastIndex < text.length) {
            tokens.push(JSON.stringify(text.slice(lastIndex)))
        }
        return `_v(${tokens.join('+')})`
    }
}
// 处理标签上的属性 attrs
function genProps(attrs) {
    let str = ''
    for (let i = 0; i < attrs.length; i++) {
        // 读取标签的每个属性
        let attr = attrs[i]
        if (attr.name === 'style') {
            let obj = {}
            attr.value.split(";").forEach(item => {
                let [key, val] = item.split(':')
                obj[key] = val
            })
            attr.value = obj
        }
        // 拼接
        str += `${attr.name}:${JSON.stringify(attr.value)},`
    }
    return `{${str.slice(0, -1)}}`
}
